home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok19
/
dossupport
/
dossupport.dok
< prev
next >
Wrap
Text File
|
1993-11-04
|
8KB
|
204 lines
======================================================================
Dokumentation zu "DosSupport" Version 1.3
Autor: Nicolas Benezan, Postwiesenstr. 2, D7000 Stuttgart 60
======================================================================
Kopierrecht
Das komplette Packet (Quelltext, Dokumentation und Objectcode) ist
Public Domain Software. Es darf beliebig kopiert und verbreitet werden
solange...
* mein Name und dieser Kopierrechtshinweis erhalten bleiben,
* die Vollständigkeit des ganzen Packets gewährleistet ist, und
* mit dem Vertrieb dieser Software kein Gewinn erwirtschaftet wird.
Die Kommerzielle Nutzung ohne meine ausdrückliche schriftliche
Genehmigung ist untersagt. Falls Sie dies beabsichtigen, nehmen Sie
bitte unter oben genannter Adresse Kontakt mit mir auf.
Verbesserungsvorschläge sind stets willkommen. Falls Sie Veränderungen
am Programm vornehmen, dokumentieren Sie diese bitte gut verständlich.
Es würde mich freuen, wenn Sie mich über größere Veränderungen in
Kenntnis setzen würden.
(c) 1988 by Nicolas Benezan. Alle Rechte vorbehalten.
Übersicht
* Umfang des Packets
* Einleitung
* Die Datentypen
* Beschreibung der Prozeduren
* Segmente
* Hinweise
* Literaturverzeichnis
Umfang des Packets
Das komplette Packet "DosSupport" beinhaltet folgendes:
* DosSupport.dok Diese Dokumentation
* DosSupport.doc Englische Dokumentation
* DosSupport.def Definitionsmodul
* DosSupport.mod Implementationsmodul
* DosSupport.sym Symboldatei (compiliertes Definitionsodul)
* DosSupport.obj Objektcode (compiliertes Implementationsmodul)
Einleitung
Bei der Entwicklung des Amiga muß anscheinend Uneinigkeit geherrscht
haben. Man könnte fast meinen, es laufen zwei Betriebssysteme in einer
Maschine: AmigaDos (in BCPL) und Exec (in C). Da wohl die meisten
Amiga-Programmierer in C oder von den Datentypen ähnlichen Sprachen
(natürlich Modula-2) programmieren, ist es lästig, daß viele
Parameter des Dos dem BCPL- und nicht dem Exec-Standard entsprechen.
Dieses Modul stellt Prozeduren zur Konvertierung der Datentypen zur
Verfügung.
Update V1.1: Da der neue Compiler V3.2 jetzt BCPL-Pointer unterstützt,
ist dies wohl nicht mehr das interessanteste an DosSupport. Trotz der
V3.2 Erweiterung wird jedoch empfohlen, für nicht ausschließlich
persönliche Programme weiterhin DosSupport zu benutzen, da die Programme
dann auf andere Compiler übertragbar sind.
Neu in DosSupport sind die Konstanten "Hunk" und der Typ "Segment" sowie
die zugehörigen Prozeduren. Hunks spielen eine große Rolle beim Format
von Programmen auf Diskette. Sie sind in [1] ausführlich beschrieben.
Werden Programme in den Speicher geladen, liegen sie als Segmente vor.
Diese sind im Kapitel "Segmente" beschrieben.
Die Datentypen
BCPL-Typen
----------
APTR/ADDRESS: Byteaddresse, d.h. eine Adresse wie sie direkt vom 68000-
Prozessor verwendet wird.
BPTR: BCPL-Pointer bzw. Langwortadresse, also Byteadresse geteilt
durch 4. D.h. alle Dos-Strukturen müssen an durch 4 teilbaren (Byte-)
Adressen beginnen.
Exec/C-Strings: Zeiger (Byteadressen) auf Bytefolgen, die mit einer
Null als Endekennzeichen abgeschlossen sind. Auch Modula-Strings sind
mit einer Null abgeschlossen.
BSTR, Dos/BCPL-Strings: Zeiger (Langwortadressen) auf eine Folge von
Bytes - das erste Byte enthält die Länge des Strings [0..255], danach
folgt der eigentliche String (ohne Abschlußzeichen).
Device-List-Typen
-----------------
Der Typ "DeviceListPtr" wurde eingeführt, um in Modula vernünftig (auch auf
andere Compiler übertragbar) mit DeviceListen umzugehen. Vorsicht: im Modul
"Dos" gibt es den einen Typ mit gleichem namen, der jedoch ein BPTR ist.
Die Typen "StartupInfo" und "DiskInfo" sind anscheinend im Modul "Dos"
vergessen worden. Das Feld "Dos.DeviceList.startup" ist in Wirklichkeit gar
kein LOGNINT sondern ein BPTR zu einem StartupInfo-RECORD. in diesem
wiederum befindet sich ein BPTR zu einem DiskInfo-RECORD. Er enthält alle
wichtigen Informationen über ein Diskettengerät, wie sie in der MountList
angegeben werden.
Beschreibung der Prozeduren
GetDevList
----------
Gibt einen Zeiger (Byteadresse) auf die Dos-DeviceList zurück. Dieser
berechnet sich aus DosBase^.root^.info^.devInfo, wobei zu beachten
ist, daß dieser Ausdruck direkt in Modula keinen Sinn gibt, da die
Dos-Zeiger ja BPTRs sind. In der DeviceList sind ale gerade verfügbaren
Volumes, Devices und assignierten Directories (logische Devices)
aufgelistet. Vorsicht: die Verkettung (mit DeviceList.next) geschieht
über BPTRs, nicht mit ExecNodes.
BPTRtoADR
---------
Wandelt einen BCPL-Pointer in eine in Modula verwendbare ADDRESS um.
ADRtoBPTR
---------
Wandelte eine ADDRESS in einen BCPL-Pointer. Vorsicht: die Adresse muß
durch 4 teilbar sein (Longword-aligned), sonst bricht das Programm mit
einer Fehlermeldung ab.
BSTRtoStr
---------
Kopiert einen BCPL-String in einen Modula-2-gerechten (ARRAY OF CHAR).
Aus EinfachheitsgrÜnden wird der String selbst (VAR) und nicht ein
Zeiger (so wie in C) übergeben.
StrToBCPL
---------
Konvertiert einen Modula-2-String in einen BCPL-String, wobei aller-
dings nur die Bytefolge übergeben wird, kein BSTR (BPTR auf BCPL-
String). Den BSTR erhält man mit:
StrToBCPL(String);
MyBSTR:=ADRtoBPTR(ADR(String));
Dies wurde so gewählt, weil sonst der String in einen eigenen Speicher-
bereich kopiert werden müßte, den DosSupport allozieren müßte.
Segmente
Wird ein ausführbares Programm, das aus einem oder mehreren Hunks
besteht, mit Dos.LoadSeg() in den Speicher geladen, wird dies nicht
unbedingt in einen zusammenhängenden Speicherbereich getan. Das
Programm wird je nach Anzahl der Hunks in Segmente unterteilt. LoadSeg()
gibt einen BCPL-Pointer (BPTR) auf eine Segmentliste zurück. Diese ist
so aufgebaut, daß der BPTR auf das Langwort VOR dem eigentlichen Code-
oder Datenspeicherbereich zeigt. In diesem Langwort befindet sich wieder
ein BPTR, der auf das Langwort vor dem nächsten Segment zeigt oder NIL
ist, wenn es kein weiteres Segment mehr gibt. Jewils zwei Langworte VOR
dem Segmentanfang steht die Länge des Segments in Bytes einschließlich
der zwei zusätzlichen Langworte.
Da in Modula die Felder eines RECORDs immer nur positive Offsets von der
Adresse des RECORDs haben können, müßte man bei den Segmenten wegen der
negativen Offsets sehr umständlich mit BPTRn und ADDRESSen hantieren.
Dies nimmt einem die Prozedur GetSegmentAddr() ab. Man erhält zB. mit
VAR Seg:SegmentPtr;
...
Seg:=GetSegmentAddr(LoadSeg(...));
einen Zeiger auf das erste Segment und mit
Seg:=GetSegmentAddr(Seg^.nextSegment);
das nächste (oder NIL, falls nicht vorhanden).
Die Größe des Code- oder Datenbereichs erhält man mit
Size:=Seg^.segmentSize-8; (* 8=2*SIZE(LONGWORD) *).
Hinweise
DosBase
-------
Zusätzlich wird von DosSupport die Variable DosBase exportiert, die
sonst von Modula nur schwer erreichbar ist. Sie darf gelesen, aber
niemals verändert werden.
Dos.def
-------
Wer noch mit dem alten Compilerhandbuch (V3.1 und älter) arbeitet,
sollte beachten, daß dort das Definitionsmodul von Dos nicht korrekt
beschrieben ist. Es wird nicht zwischen ADDRESS und BPTR unterschieden.
Es empfiehlt sich, sich ein Update zu besorgen. Bei der Compiler-
version 3.11 ist das korrekte Dos.def auf Diskette mitgeliefert, die
Handbücher ab V3.2 sind verbessert worden.
Literaturverzeichnis
[1] "AmigaDos Technical Reference Manual", CBM, Chapter 2.2
oder "AmigaDos Manual", Bantam Books
[2] "Amiga Rom Kernel Reference Manual: Exec",
Appendix B: AmigaDos general information, CBM, Addison Wesley